1   /*
2    * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   */
23  
24  /* @test
25   * @bug 4771562
26   * @summary Verify that if ObjectInputStream.read(byte[], int, int) is called
27   *          with a null byte array and invalid offset/length values, a
28   *          NullPointerException is thrown rather than an
29   *          IndexOutOfBoundsException.
30   */
31  
32  import java.io.*;
33  
34  public class Test {
35      public static void main(String[] args) throws Exception {
36          ByteArrayOutputStream bout = new ByteArrayOutputStream();
37          ObjectOutputStream oout = new ObjectOutputStream(bout);
38          byte[] b = new byte[10];
39          int[][] badBounds =
40              { { -1, -1}, { -1, 5 }, { 5, -1 }, { 100, 5 }, { 5, 100 } };
41  
42          for (int i = 0; i < badBounds.length; i++) {
43              try {
44                  oout.write(null, badBounds[i][0], badBounds[i][1]);
45                  throw new Error();
46              } catch (NullPointerException e) {
47              }
48          }
49          for (int i = 0; i < badBounds.length; i++) {
50              try {
51                  oout.write(b, badBounds[i][0], badBounds[i][1]);
52                  throw new Error();
53              } catch (IndexOutOfBoundsException e) {
54              }
55          }
56          oout.write(b);
57          oout.flush();
58  
59          ObjectInputStream oin = new ObjectInputStream(
60              new ByteArrayInputStream(bout.toByteArray()));
61          for (int i = 0; i < badBounds.length; i++) {
62              try {
63                  oin.read(null, badBounds[i][0], badBounds[i][1]);
64                  throw new Error();
65              } catch (NullPointerException e) {
66              }
67          }
68          for (int i = 0; i < badBounds.length; i++) {
69              try {
70                  oin.read(b, badBounds[i][0], badBounds[i][1]);
71                  throw new Error();
72              } catch (IndexOutOfBoundsException e) {
73              }
74          }
75          oin.read(b);
76      }
77  }